package com.copsoftware.comun.dao;

import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;

import com.copsoftware.db.DAOSession;
import com.copsoftware.entity.DenDenunciaImpl;
import com.copsoftware.entity.GeoLugarImpl;
import com.copsoftware.entity.GeoZonaImpl;
import com.copsoftware.reportes.geografico.beans.BeanDelitoFlt;
import com.copsoftware.utils.beans.DateFormatter;
import com.copsoftware.utils.beans.DateUtils;
import com.copsoftware.utils.beans.GeoUtils;
import com.copsoftware.utils.dao.WhereBuilder;
import com.vividsolutions.jts.geom.Geometry;

public class GeometryDAO extends DAOSession {
	protected final Log logger = LogFactory.getLog(getClass());

	public void guardarGeometryLugar(String cadenaPuntos) {
		// GeoLugarImpl geoLugarImpl = getGeoLugarImpl(cadenaPuntos);
		// getSession().saveOrUpdate(getGeoImpl(cadenaPuntos));
		// StringBuffer sql = new StringBuffer();
		// sql.append("UPDATE GEO_ZONA SET
		// G_LIMITE=GeomFromText(").append(GeoUtils.obtenerPolygono(cadenaPuntos)).append(")");
		// sql.append(" where C_ZONA=").append(1);
		// getSession().createSQLQuery(sql.toString()).executeUpdate();
		// GeoZonaImpl geoZona = new GeoZonaImpl();
		// getSession().load(geoZona, new Integer(5));
		// geoZona.setGLimite(GeoUtils.obtenerPolygono(cadenaPuntos));
		GeoLugarImpl geoLugar = new GeoLugarImpl();
	//	geoLugar.setGPosicionIcono(GeoUtils.obtenerPoint(cadenaPuntos)[0]);
		getSession().load(geoLugar, new Integer(2));
		geoLugar.setGPosicion(GeoUtils.obtenerPolygono(cadenaPuntos));
		guardarObject(geoLugar);
	}
	
	public void guardarObject(Object geo)
	{
		getSession().saveOrUpdate(geo);
	}
	//Asignar una coordenada a un delito
	public void guardarGeometryPoints(String cadenaPuntos)
	{
		Geometry [] arrPoints =GeoUtils.obtenerPoint(cadenaPuntos);
		logger.info(arrPoints.length);
		
		logger.info("Registrando 0...");
		DenDenunciaImpl denuncia = new DenDenunciaImpl();
		Geometry posicion = arrPoints[0];
		getSession().load(denuncia, new Integer(72));
		denuncia.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia);
		getSession().flush();
		logger.info("Registrado 0...");
		
		logger.info("Registrando 1...");
		DenDenunciaImpl denuncia1 = new DenDenunciaImpl();
		posicion = arrPoints[1];
		getSession().load(denuncia1, new Integer(3));
		denuncia1.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia1);
		getSession().flush();
		logger.info("Registrando 1...");
		
		logger.info("Registrando 2...");
		DenDenunciaImpl denuncia2 = new DenDenunciaImpl();
		posicion = arrPoints[2];
		getSession().load(denuncia2, new Integer(70));
		denuncia2.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia2);
		getSession().flush();
		logger.info("Registrando 2...");
		
		logger.info("Registrando 3...");
		DenDenunciaImpl denuncia3 = new DenDenunciaImpl();
		posicion = arrPoints[3];
		getSession().load(denuncia3, new Integer(74));
		denuncia3.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia3);
		getSession().flush();
		logger.info("Registrando 3...");
		
		logger.info("Registrando 4...");
		DenDenunciaImpl denuncia4 = new DenDenunciaImpl();		
		posicion = arrPoints[4];
		getSession().load(denuncia4, new Integer(78));
		denuncia4.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia4);
		getSession().flush();
		logger.info("Registrando 4...");

		logger.info("Registrando 5...");
		DenDenunciaImpl denuncia5 = new DenDenunciaImpl();
		posicion = arrPoints[5];
		getSession().load(denuncia5, new Integer(76));
		denuncia5.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia5);
		getSession().flush();
		logger.info("Registrando 5...");
		
		logger.info("Registrando 6...");
		DenDenunciaImpl denuncia6 = new DenDenunciaImpl();		
		posicion = arrPoints[6];
		getSession().load(denuncia6, new Integer(71));
		denuncia6.setGPosicion(posicion);
		getSession().saveOrUpdate(denuncia);
		getSession().flush();
		logger.info("Registrado 6...");
	}

	private Object getGeoImpl(String cadenaPuntos) {
		// GeoLugarImpl geoLugarImpl = new GeoLugarImpl();
		// geoLugarImpl.setGPosicion(GeoUtils.obtenerPolygono(cadenaPuntos));
		// geoLugarImpl.setCCalle(new Integer(1));
		// return geoLugarImpl;
		GeoZonaImpl geoZona = new GeoZonaImpl();

		return null;
	}

	public List buscarZona() {
		StringBuffer hql = new StringBuffer();
		hql.append("from GeoZonaImpl");
		return (List) getSession().createQuery(hql.toString()).list();
	}

	public List buscarBeanZona() {
		StringBuffer hql = new StringBuffer();
		hql
				.append("select GLimite as GLimite,count() as numMaxDelito from GeoZonaImpl");
		return (List) getSession().createQuery(hql.toString()).list();
	}

	// public GeoZonaImpl buscarZona() {
	// GeoZonaImpl zona = new GeoZonaImpl();
	// getSession().load(zona, new Integer(4));
	// return zona;
	// }

	public List buscarDelitos(BeanDelitoFlt beanDelitoFlt) {
		StringBuffer hql = new StringBuffer();
		hql.append("from DenDenunciaImpl ");
		WhereBuilder where = new WhereBuilder(beanDelitoFlt);
		where.registerMatch("tipoDelito", "CTipoDelito");
		where.registerMatch("estado", "CEstado");
		where.execute();
		if (where.getParameters() != null) {
			hql.append("where ");
			hql.append(where.getSql());
		}
		Date fechaInicial = DateFormatter
				.parse(beanDelitoFlt.getFechaInicial());
		logger.info(fechaInicial);
		Date fechaFinal = DateFormatter.parse(beanDelitoFlt.getFechaFinal());
		logger.info(fechaFinal);
		// hql.append(" and FDenuncia between to_date(?,'DD/MM/YYYY') and
		// to_date(?,'DD/MM/YYYY') ");
		// hql.append(" and FDenuncia between ? and ? ");
		hql.append(" and FDenuncia between to_date('").append(
				DateUtils.dateToString(fechaInicial)).
		// append(",'DD/MM/YYYY') and to_date(?,'DD/MM/YYYY') ");
				append("','DD/MM/YYYY') and to_date('").append(
						DateUtils.dateToString(fechaFinal)).append(
						"','DD/MM/YYYY') ");
		hql.append(" order by FDenuncia asc ");
		Query q = getSession().createQuery(hql.toString());
		// q.setString(0,beanDelitoFlt.getFechaInicial() );
		// q.setString(1, beanDelitoFlt.getFechaFinal());
		// q.setDate(0,fechaInicial );
		// q.setDate(1, fechaFinal);
		logger.info(q.toString());
		return q.list();
	}
	
	public String[] obtenerGPolygonCalle(String deCalle) {
		GeoLugarImpl geoLugarImpl = new GeoLugarImpl();
		StringBuffer hql = new StringBuffer();
		//TODO HACER UN LIKE Y LEVANTAR UNA LISTA DE OPCIONES EN UN POPUP, PARA LA BUSQUEDA
		hql.append("from GeoLugarImpl where XLugar='").append(deCalle).append("'");
		List list = getSession().createQuery(hql.toString()).list();
		geoLugarImpl = (GeoLugarImpl)list.get(0);
		String [] params = new String[2];
		params[0]= geoLugarImpl.getGPosicion().toString();
		params[1]= geoLugarImpl.getCLugar().toString();
		return params;
	}

	public String obtenerGLatLng(Integer idDenuncia) {
		DenDenunciaImpl denunciaImpl = new DenDenunciaImpl();
		getSession().load(denunciaImpl, idDenuncia);
		String wkt = denunciaImpl.getGPosicion().toString();
		return wkt;
	}

	public void guardarZona(String cadenaPuntos) {
		GeoZonaImpl geoZona = new GeoZonaImpl();
		geoZona.setGLimite(GeoUtils.obtenerPolygono(cadenaPuntos));
		guardarObject(geoZona);		
	}


}
